<?php
/**
 * @File name: datamysqlpdo.php
 * @author: 李枨煊[Email:lcx165@gmail.com]
 * @Date: Thu Jan 10 11:45:11 CST 2008
 * @Desription: MySQL(PDO)操作类
 */

class DataMysql{
	private $modeType = PDO::FETCH_ASSOC;
	private $host = 'localhost';
	private $user = 'root';
	private $pass = '';
	private $database = 'database';
	private $debug = true;
	public $link = null;
	private $sql;
	private $pdo;
	
	/**
	 * 构造方法
	 *
	 * @return Data_DbMysql
	 */
	public function __construct($host, $user, $pass, $database, $debug=true)
	{
		$this->host = $host;
		$this->user = $user;
		$this->pass = $pass;
		$this->database = $database;
		$this->debug=$debug;
		$this->link = $this->getLink();
	}
	
	/**
	 * 析构
	 *
	 */
//	function __destruct()
//	{
//		$this->disConnect();
//	}
	
	/**
	 * 取得mysql数据库连接句柄
	 *
	 * @return int mysql连接句柄
	 */
	public function getLink()
	{
		try
		{
			$dsn = "mysql:host={$this->host};dbname={$this->database}";
//			$this->pdo = new PDO($dsn, $this->user, $this->pass, array(PDO::ATTR_PERSISTENT => true));
			$this->pdo = new PDO($dsn, $this->user, $this->pass);
			$this->query("SET NAMES utf8");	//设置编码
		}
		catch (PDOException $e)
		{
			die ("Error!: " . $e->getMessage() . "<br/>");
		}
	}
	/**
	 * 查询数据库
	 *
	 * @param string $sql
	 */
	public function query($sql)
	{
		$this->sql = & $sql;
		$result = $this->pdo->query($this->sql);	//查询

		//报错
		if($result === false && $this->debug === true)
		{
			echo $this->getError();
			return false;
		}
		return $result;
	}
	
	 /**
	 * 设置查询结果返回数据类型
	 *
	 * @param int $modeType 设置查询结果返回设置,1为关联索引和数字所有都有,2为使用关联索引,3为使用数字索引
	 */
	public function setFetchMode($modeType)
	{
		switch ($modeType){
			case 1:	//数字索引和关联索引都有
				$this->modeType = PDO::FETCH_BOTH;
				break;
			case 2:	//使用关联索引
				$this->modeType = PDO::FETCH_ASSOC;
				break;
			case 3: //使用数字索引
				$this->modeType = PDO::FETCH_NUM;
				break;
			default://缺省使用关联索引
				$this->modeType = PDO::FETCH_ASSOC;
		}
	}
	
	/**
	 * 返回一堆结果
	 *
	 * @param string $sql	SQL语句
	 * @return array	结果集
	 */
	public function getRows($sql)
	{
		$this->sql = & $sql;
		$result = $this->query($this->sql);	//发送查询

		$result->setFetchMode($this->modeType);	//指定结果样式
		return $result->fetchAll();
	}
	
	/**
	 * 返回一堆结果（对象）
	 *
	 * @param string $sql	SQL语句
	 * @return array	结果集
	 */
	public function getRows_obj($sql)
	{
		$this->sql = & $sql;
		$result = $this->query($this->sql);	//发送查询

		$result->setFetchMode(PDO::FETCH_OBJ);	//指定结果样式
		return $result->fetchAll();
	}
	
	/**
	 * 执行sql返回该语句影响的行数,如update,delete
	 *
	 * @param string $sql
	 * @return int 
	 */
	public function execute($sql)
	{
		$this->sql = & $sql;
		$result = $this->pdo->exec($this->sql);

		if($result===false && $this->debug===true)	//无结果，报错
		{
			echo $this->getError();
		}
		return $result;
	}
	
	/**
	 * 获取上次插入操作的的ID
	 *
	 * @return int 如果没有连接或者查询失败,返回0, 成功返回ID
	 */
	public function getLastInsertId()
	{
		return $this->pdo->lastInsertId();
	}
	
	/**
	 * 获取单行记录(一维数组)
	 *
	 * @param string $sql 需要执行查询的SQL语句
	 * @return array 成功返回结果记录的一维数组,失败返回false
	 */
	function getRow($sql)
	{
		$this->sql = & $sql;
		$result = $this->query($this->sql);	//发送查询

		$result->setFetchMode($this->modeType);	//指定结果样式
		return $result->fetch();
	}
	
	/**
	 * 获取单行记录(一维对象)
	 *
	 * @param string $sql 需要执行查询的SQL语句
	 * @return array 成功返回结果记录的一维数组,失败返回false
	 */
	function getRow_obj($sql)
	{
		$this->sql = & $sql;
		$result = $this->query($this->sql);	//发送查询

		$result->setFetchMode(PDO::FETCH_OBJ);	//指定结果样式
		return $result->fetch();
	}
	
	 /**
	 * 获取一个数据(当条数组)
	 *
	 * @param string $sql 需要执行查询的SQL
	 * @return 成功返回获取的一个数据
	 */
	function getOne($sql, $field='')
	{
		$this->sql = & $sql;
		$result = $this->query($this->sql);	//发送查询

		$result->setFetchMode(PDO::FETCH_NUM);	//指定结果样式
		$result_arr = $result->fetch();
		return $result_arr[0];
	}
	
	/**
	 * 获取一列数据(一维数组)
	 *
	 * @param string $sql 需要获取的字符串
	 * @param string $field 需要获取的列,如果不指定,默认是第一列
	 * @return 成功返回提取的结果记录的一维数组,失败返回false
	 */
	function getCol($sql, $field='')
	{
		$this->sql = & $sql;
		$query = $this->query($this->sql);	//发送查询
		$query->setFetchMode(PDO::FETCH_ASSOC);	//指定结果样式
		$result_arr = $query->fetchAll();

		$result = array();		
		foreach ($result_arr as $value)
		{
			if($field == '')
			{
				$result[] = current($value);
			}
			else
			{
				$result[] = $value[$field];
			}
		}
		
		return $result;
	}
	
	/**
	 * 查询所有字段信息
	 *
	 * @param unknown_type $table_name
	 * @return unknown
	 */
	function getFields($table_name)
	{
		$result_field = $this->getRows('SHOW COLUMNS FROM '.$table_name);	//查询所有字段
		return $result_field;
	}
	
	
	/**
	 * 返回一个数据表的字段总数
	 *
	 * @param  $table_name
	 * @return 表的字段总数
	 */
	function getFieldSum($table_name)
	{
		$result_field = $this->getFields($table_name);
		return count($result_field);
	}
	
	 /**
	 * 返回一个表的字段名和类型的数组
	 *
	 * @param  $table_name	表名
	 * @return 这个表的字段名数组
	 */
	function getFieldNames($table_name)
	{
		$result_field = $this->getFields($table_name);	//取得所有字段信息
		
		$result = array();
		foreach ($result_field as $value)
		{
			$fieldName = & $value['Field'];	//字段名

			$strpos = strpos($value['Type'],'(');	//(第一次出现的位置
			if($strpos === false)	//没有括号
			{
				$fieldType = & $value['Type'];
			}
			else	//有括号，截去括号后面的
			{
				$fieldType = substr($value['Type'],0,$strpos);
			}			
			
			$result[] = array(
				'field_name'	=> $fieldName,
				'field_type'	=> $fieldType,
			);
		}
		return $result;
	}
	
	/**
	 * 报错
	 *
	 * @return unknown
	 */
	function getError()
	{
		require_once(SUIKEE_DIR.'/class/common/stx.class.php');
		$stx = new STX('mysql');
		$this->sql = $stx->stx_string($this->sql);
		
		$errors = $this->pdo->errorInfo();	//取得错误信息
		return  '<b>ERROR_NUMBER</b> : '. $errors[1] . '<br /><b>ERROR_INFO</b> : ' . $errors[2] . '<br /><b>ERROR_SQL</b> : ' . $this->sql . '<br /><br /><br />';	
	}
	
}

// 创建实例
$db = new DataMysql($cfg_db['host'], $cfg_db['user'], $cfg_db['pass'], $cfg_db['database'], $cfg_db['debug']);

?>